package cn.demoncat.util.xml.entity;

import cn.demoncat.util.lang.entity.MapSs;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import org.apache.commons.lang3.StringUtils;

import java.util.Map.Entry;

/**
 * XStream MapSs转换器
 * 
 * 默认XStream转换Map时会创建Entry节点；注册本转换器后MapSs类型直接以Key作为节点。
 * 
 * @author 延晓磊
 *
 * @since 2019年10月10日
 */
public class XStreamMapSsConverter implements Converter {

	/**
	 * 实例
	 */
	public static final Converter INSTANCE = new XStreamMapSsConverter();

	/**
	 * 类型判断
	 * 
	 * @param 	type	
	 * @return	如果是MapSs则返回true
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年10月10日
	 *
	 */
	@Override
	public boolean canConvert(Class type) {
		return MapSs.class.equals(type);
	}
 
	/**
	 * 序列化
	 * 
	 * @param source
	 * @param writer
	 * @param context
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年10月10日
	 *
	 */
	@Override
	public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
		for (Entry<String,String> entry : ((MapSs)source).entrySet()) {
			if (!StringUtils.isAnyBlank(entry.getKey(), entry.getValue())) {
				writer.startNode(entry.getKey());
				writer.setValue(entry.getValue());
				writer.endNode();
			}
		}
	}

	/**
	 * 反序列化
	 * 
	 * @param reader
	 * @param context
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年10月10日
	 *
	 */
	@Override
	public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        MapSs map = new MapSs();
        while(reader.hasMoreChildren()) {
            reader.moveDown();
            map.put(reader.getNodeName(), reader.getValue());
            reader.moveUp();
        }
        return map;
	}
}
